iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

laravel+vue 學習系列 第 5

Day5. 補充 Controller + 建立路由

  • 分享至 

  • xImage
  •  

一、路由快取

  • 加速解析 routes/* 下的路由
  • 將所有的 Controller、view、轉址與資源路徑製作快取
  • 使用 Clourse 產生的路由不能生成快取
  • 每次有調整路由時必須重新產生快取檔案
  • 產生的快取檔案在 bootstrap/cache/route{*}.php 檔案
    # 產生快取
    php artisan route:cache
    
    # 清除快取
    php artisan route:clear

二、HTTP 動詞與表單

  1. HTTP 動詞
  • 表單不支援 put, patch, delete, 需在表單內添加 hidden 欄位指示表單動詞
    # blade 模板語法
    @method('DELETE')
    
    # 使用 Route 靜態 function
    Route::delete();
  1. csrf
  • 產生欄位名稱 _token, 傳至後台與 session 比對
  • 模板語法 @csrf 產生 hidden 欄位( laravel 5.6 之前要使用 csrf_field() 產生欄位 )
  • 當表單送出的路由不是唯獨, 需要添加 csrf token
  • js ajax 使用 csrf token
    • 設定 meta
        <!-- 設定 csrf token 在 meta -->
        <meta name="csrf-token" id="token" content="<?php echo csrf_token(); ?>" >
    
    • js 取得 csrf token
        // JQuery
        $ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
    
        // Axios
        window.axios.defaults.headers.common['X-CSRF-TOKEN'] = 
        document.head.querySelector('meta[name="csrf-token"]');
    

三、轉址

  1. 轉址方法

    • 全域輔助函式
        return redirect('/');
    
        # @param string $to 有效內部路徑
        # @param string $status HTTP 狀態碼
        # @param array $headers HTTP 標頭
        # @param boolean $secure http, https 預設選項
        return redirect()->to();
    
        # @param string $to 路由名稱
        # @param array $parameters 路由參數
        # @param string $status HTTP code
        # @param array $headers HTTP 標頭
        return redirect()->route();
    
        # 轉址到來源
        return redirect()->back();   
    
    • 靜態介面
        Route::redirect('/');
    
    • 全域輔助函式和靜態方法, 都會產生 Illuminate\Http\RedirectResponse 實例
  2. 轉址時攜帶值

    • with() 方法
        # 帶一個值
        return redirect('/product')->with('key', 'value);
    
        # 帶多筆值
        return redirect('/product')->with([
            'error' => true,
            'message' => 'Whoops!'
        ]);
    
    • withInput() 方法
        # 帶使用輸入表單的值, 常用在表單驗證發生錯誤時, 轉址同時帶入使用者輸入的內容
        return redirect('form')
            ->withInput()
            ->with([
                'error' => true,
                'message' => 'Whoops!'
            ]);
    
    • withErrors() 方法
        # 常用在表單驗證發生錯誤時, 將驗證結果一同回傳到表單頁面 ( 上一頁 back() )
        return back()->withErrors($validator);
    

四、中止請求

使用全域函式 abort()、 abort_if()、 abort_unless(), 終止 Controller 流程

    # 第一個參數為 HTTP code, 第二個參數為顯示文字, 第三個參數為響應標頭
    abort(403, '找不到檔案!', $headers);
    
    # 第一個參數判斷是否為 true, 接著執行後面代碼
    abort_if( $request->user_id == '', 403);
    
    # 第一個參數判斷是否為 false, 接著執行後面代碼
    abort_unless($request->user_id == '', 403);

五、自訂回應

使用 response() 輔助函式或是 Response 靜態介面執行

  1. make() 方法
    # 第一個參數為回傳內容
    # 第二個參數為 HTTP code
    # 第三個參數為 header 標頭
    return response()->make('測試回傳內容!', 200, $headers);
  1. json(), jsonp() 方法
    # 建立 JSON 回傳內容
    return response()->json(Product::all());
  1. download(), streamDownload(), file() 方法
    # 第一個參數為檔案在伺服器上位置, 第二個為下載名稱, 第三個參數為 header 標頭
    return response()->download('file_path.pdf', 'download.pdf', $headers);
    
    # 直接回傳檔案內容, 當要顯示圖片、PDF 等檔案時可使用 file() 方法
    return response()->file('file_path.pdf');
    
    # 
    return response()->streamDownload(function() {
        $file = './file_path';
        $server_file = File::get($file);
        echo $file;
    }, 'download.pdf');

六、建立專案要用的路由

  1. 先建立商品、文章兩個資源控制器當後台 CRUD 架構的 Controller , 兩個控制器分類(group) prefix 設定為 admin

    • 商品資源控制器
    • 文章資源控制器
        # 建立 Product Controller
        php artisan make:controller ProductController --resource
    
        # 建立 Article Controller
        php artisan make:controller ArticleController --resource
    
    • routes/web.php
        Route::group(['prefix' => 'admin'], function(){
    
            Route::resource('product', 'App\Http\Controllers\ProductController');
            Route::resource('article', 'App\Http\Controllers\ArticleController');
    
        });
    
    • php artisan route:list
      https://ithelp.ithome.com.tw/upload/images/20220910/20128127MdnXoGvvLB.png

上一篇
Day4. Controller
下一篇
Day6. Blade
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言